import sqlite3
import logging
from typing import Any, Dict

from langchain.tools import BaseTool

# 确保 agent_service 正常导入
from agent import agent_service

# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

class DeleteTimer(BaseTool):
    name: str = "DeleteTimer"
    description: str = "用于删除某一个日程，接受任务id作为参数，如：2"

    def __init__(self):
        super().__init__()

    def _delete_task_from_db(self, task_id: int) -> int:
        """
        从数据库中删除指定 ID 的任务，并返回删除的行数
        """
        try:
            with sqlite3.connect('timer.db') as conn:
                cursor = conn.cursor()
                cursor.execute("DELETE FROM timer WHERE id = ?", (task_id,))
                rows_deleted = cursor.rowcount
                conn.commit()
                logging.info(f"成功删除 {rows_deleted} 行任务，任务ID: {task_id}")
                return rows_deleted
        except sqlite3.OperationalError as oe:
            logging.error(f"数据库操作错误: {oe}")
            return 0
        except sqlite3.IntegrityError as ie:
            logging.error(f"数据库完整性错误: {ie}")
            return 0
        except Exception as e:
            logging.error(f"数据库未知错误: {e}")
            return 0

    def _run(self, para: str) -> str:
        """
        删除任务并取消任务调度。
        :param para: 任务 ID，应该是一个整数形式的字符串。
        :return: 操作结果的字符串。
        """
        # 输入验证，确保 para 是有效的任务 ID
        if not para.isdigit():
            return "输入的 ID 无效，必须是数字。"

        task_id = int(para)

        # 从数据库删除任务
        rows_deleted = self._delete_task_from_db(task_id)
        if rows_deleted == 0:
            return f"未找到 ID 为 {task_id} 的任务，删除失败。"

        # 如果任务存在于调度系统中，则取消任务
        if hasattr(agent_service, 'scheduled_tasks') and isinstance(agent_service.scheduled_tasks, dict):
            if task_id in agent_service.scheduled_tasks:
                try:
                    agent_service.scheduled_tasks[task_id].cancel()
                    del agent_service.scheduled_tasks[task_id]
                    logging.info(f"任务 {task_id} 在调度系统中已取消。")
                except Exception as e:
                    logging.error(f"取消任务调度时出错: {e}")
                    return f"取消任务调度时出错: {e}"
            else:
                return f"调度系统中未找到 ID 为 {task_id} 的任务。"
        else:
            logging.error("调度系统中不存在 scheduled_tasks 或类型不正确")
            return "调度系统未初始化或配置错误。"

        return f"任务 {task_id} 取消成功。"

if __name__ == "__main__":
    tool = DeleteTimer()
    result = tool._run("1")  # 可以修改为需要测试的 task_id
    print(result)
